<?php
/**
 * 21cnjySDK
 * @author    Simon <150986416@qq.com>
 * @filename  SignatureHelper.php
 * @created   2017/7/5 下午1:55
 */

namespace sdk;

class SignatureHelper
{
    /**
     * 客户端请求信息中签名的参数名称
     */
    const CLIENT_SIGN_PARAM = 'sign';

    /**
     * 客户端请求信息中 AccessKey 的参数名称
     */
    const CLIENT_ACCESS_KEY_PARAM = 'access-key';

    /**
     * 客户端请求信息中 时间戳 的参数名称
     */
    const CLIENT_TIMESTAMP_PARAM = 'timestamp';

    /**
     * 客户端请求中 参与签名的随机字符 对应的参数名称
     */
    const CLIENT_SALT_PARAM = 'salt';


    /**
     * 生成签名
     * @param array $params 请求的的参数
     * ~~~
     * array (
     *  'timestamp' => 1494906754,
     *  'access_key' => '21cnjySKFAfsgLw3fbUX2p',
     *  'salt' => 'fdatrghkjt',
     * )
     * ~~~
     * @param string $secret 秘钥串
     * @return string
     */
    public static function generator($params = [], $secret)
    {
        if (empty($params) || empty($secret)) {
            return "";
        }

        //签名步骤一：按字典序排序参数 A~Z 顺序排列
        ksort($params);

        //签名步骤二：将排列好的顺序用键值对拼接成字符串 key1=val1&key2=val2 格式
        $buff = "";
        foreach ($params as $k => $v)
        {
            //参与签名的请求数据不包括签名本身
            if($k != static::CLIENT_SIGN_PARAM && !empty($v) && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");

        //签名步骤三：MD5加密
        $string = md5($buff);

        //签名步骤四: 将加密后的字符串 加入 Secret 使用哈希 sha256 加密 并进行 base64加密
        $string = base64_encode(hash_hmac('sha256', $string, $secret, true));

        //签名步骤五：所有字符转为大写
        $result = strtoupper($string);

        return $result;
    }
}